package com.tyf.common.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @ClassName: LogUtils<br>
 * @Description: 日志记录工具类<br>
 * @author liutao<br>
 * @date 2016年9月29日上午10:33:19<br>
 *
 */
public class LogUtils {
	/**
	 * 默认日志输出类
	 */
	public static final Logger EYD_LOG = LoggerFactory.getLogger("eud-log");
	public static final String DEBUG = "debug";
	public static final String INFO = "info";
	public static final String ERROR = "error";
	public static final String MSG_LABEL = "==========>";
	
	private LogUtils() {}
	
	/**
	 * debug日志信息
	 * @param msg 日志信息
	 */
	public static void logDebug(Object msg){
		logDebug(EYD_LOG, msg);
	}
	
	/**
	 * info日志信息
	 * @param msg 日志信息
	 */
	public static void logInfo(Object msg){
		logInfo(EYD_LOG, msg, null);
	}
	
	/**
	 * info日志信息
	 * @param msg 日志信息
	 * @param e exception
	 */
	public static void logInfo(Object msg, Throwable e){
		logInfo(EYD_LOG, msg, e);
	}
	
	/**
	 * error日志信息,可打印异常
	 * @param msg 日志信息
	 * @param e exception
	 */
	public static void logError(Object msg, Throwable e){
		logError(EYD_LOG, msg, e);
	}
	
	/**
	 * debug日志信息,指定日志类
	 * @param logger 日志类
	 * @param msg 日志信息
	 */
	public static void logDebug(Logger logger, Object msg){
		// 增加判断，避免不必要的执行日志语句
		if(logger.isDebugEnabled()) {
			log(DEBUG, logger, msg, null);
		}
	}
	
	/**
	 * info日志信息,指定日志类,输出异常栈
	 * @param logger 日志类
	 * @param msg 日志信息
	 * @param e
	 */
	public static void logInfo(Logger logger, Object msg, Throwable e){
		log(INFO, logger, msg, e);
	}
	
	/**
	 * error日志信息,指定日志类,输出异常栈
	 * @param logger 日志类
	 * @param msg 日志信息
	 * @param e
	 */
	public static void logError(Logger logger, Object msg, Throwable e){
		log(ERROR, logger, msg, e);
	}
	
	/**
	 * 封装日志格式            ==========>DEBUG: [userCode][msg][exception]
	 * @param level
	 * @param logger
	 * @param msg
	 * @param e
	 */
	public static void log(String level, Logger logger, Object msg, Throwable e){
		StringBuilder sb = new StringBuilder();
		sb.append(getBlock(msg));
		if(level.equals(DEBUG)){
			logger.debug(MSG_LABEL + "DEBUG: " + sb.toString(), e);
		}else if(level.equals(INFO)){
			logger.info(MSG_LABEL + "INFO: " + sb.toString(), e);
		}else{
			logger.error(MSG_LABEL + "ERROR: " + sb.toString(), e);
		}
	}
	
	/**
	 * 获取日志信息块，形如<msg>格式
	 * @param msg
	 * @return
	 */
	public static String getBlock(Object msg) {
        if (msg == null) {
            msg = "";
        }
        return "[" + msg.toString() + "]";
    }
}
